package com.ruoyi.aitcommon.utils;

import java.io.File;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class XmlUtils {
	/**
	 * 加载xml文件
	 * @param filename
	 * @return xml对象
	 */
	public static Document load(String filename) {
		Document document = null;
		try {
			SAXReader saxReader = new SAXReader();
			saxReader.setEncoding("UTF-8");
			document = saxReader.read(new File(filename)); // 读取XML文件,获得document对象
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return document;
	}
	
	/**
	 * 将map按照OA格式,转换为xml
	 * 转换说明:
	 * 每一个对象转化为XML节点
	 * 每一个变量转化为节点值
	 * "$name": "编码", 会转化为节点属性
	 * "value": "0101", 会转化为 <value><![CDATA[测试物料01]]></value>
	 * 举例:
	 * 转换前
	 * {
	 * 	"formExport": [
	 *                {
	 * 			"summary": {
	 * 				"$name": "formmain_0024",
	 * 				"$id": ""
	 *            },
	 * 			"values": {
	 * 				"column": [
	 *                    {
	 * 						"$name": "编码",
	 * 						"value": "0101",
	 * 						"$id": ""
	 *                    },
	 *                    {
	 * 						"$name": "名称",
	 * 						"value": "测试物料01",
	 * 						"$id": ""
	 *                    },
	 *                    {
	 * 						"$name": "物料分类",
	 * 						"value": "物料分类01",
	 * 						"$id": ""
	 *                    },
	 *                    {
	 * 						"$name": "ts",
	 * 						"value": "2023-11-26",
	 * 						"$id": ""
	 *                    }
	 * 				]
	 *            }
	 *        }
	 * 	]
	 * }
	 * 转换后:
	 *<?xml version="1.0" encoding="UTF-8"?>
	 * <forms>
	 * 	<formExport>
	 * 		<summary name="formmain_0024"/>
	 * 		<values>
	 * 			<column name="编码">
	 * 				<value><![CDATA[0101]]></value>
	 * 			</column>
	 * 			<column name="名称">
	 * 				<value><![CDATA[测试物料01]]></value>
	 * 			</column>
	 * 			<column name="物料分类">
	 * 				<value><![CDATA[物料分类01]]></value>
	 * 			</column>
	 * 			<column name="ts">
	 * 				<value><![CDATA[2023-11-26]]></value>
	 * 			</column>
	 * 		</values>
	 * 	</formExport>
	 * </forms>
	 *
	 * @param rootName 根节点名字
	 * @param map 需要转换的数据,一般是json对象
	 * @return xml对象
	 */
	public static Document Map2Xml(String rootName, Map<String,Object> map) {
		if(map==null)
			return null;
		Document xmldoc = DocumentHelper.createDocument();
		Element rootNode = xmldoc.addElement(rootName);
		for(String key:map.keySet()) {
			Value2Element(rootNode,key,map.get(key));
		}
		return xmldoc;
	}
	
	public static Document Map2Xml(String rootName, List<Map<String,Object>> maplist) {
		if(maplist==null)
			return null;
		Document xmldoc = DocumentHelper.createDocument();
		Element rootNode = xmldoc.addElement(rootName);
		for(Map<String,Object> map:maplist) {
			for(String key:map.keySet()) {
				Value2Element(rootNode,key,map.get(key));
			}
		}
		return xmldoc;
	}
	
	/**
	 * 将key-value按照OA格式添加到parent XML节点下
	 * @param parent XML父节点
	 * @param key 需要添加的k-v
	 * @param value 需要添加的k-v
	 */
	@SuppressWarnings("unchecked")
	private static void Value2Element(Element parent,String key,Object value) {
		//如果值为空,需要添加空值节点
		//if(value==null||value.toString().length()==0) return;
		
		if(key.startsWith("$")) {
//			在父节点更新属性
			String key1=key.substring(1);
			parent.addAttribute(key1, value.toString());
		}else if (value instanceof List) {
//			列表类型处理
			List<Object> list=(List<Object>)value;
			for(Object item:list) {
				Value2Element(parent,key,item);
			}
		}else if(value instanceof Map) {
//			子类,递归梳理
			Map<String,Object> map=(Map<String,Object>)value;
			Element curnode = parent.addElement(key);
			for(String subkey:map.keySet()) {
				Value2Element(curnode,subkey,map.get(subkey));
			}
		}else {
//			节点值处理
			Element curnode = parent.addElement(key);
			if(value==null||value.toString().length()==0){
				//如果值为空,需要添加空值节点
				curnode.addCDATA("");
			}else{
				curnode.addCDATA(value.toString());
			}

		}
		return;
	}
}
